import { Injectable } from '@angular/core'
import { Observable } from 'rxjs'

import { EReportStatus, EReportType } from '@shared/enums/index'
import { IBiz } from '@shared/interfaces/biz'
import {
  IReportSettingPagination,
  IReportConfigPagination,
  IReportReleaseRecordPagination,
} from '@shared/interfaces/report'

// 报表设定查询参数
export interface IReportSettingParams {
  size: number
  page: number
  code?: string // 报表代码
  name?: string // 报表名称
  type?: EReportType // 报表类型
  fileType?: string // 文件类型
  bizLevel?: string // 报表层级，指机构、集团、商户和门店
  status?: EReportStatus // 报表状态
  // TODO: 创建时间和更新时间
}

// 报表配置查询参数
export interface IReportConfigParams extends IBiz {
  size: number
  page: number
  code?: string // 报表代码
  name?: string // 报表名称
  type?: EReportType // 报表类型
  fileType?: string // 文件类型
  bizLevel?: string // 报表层级，指机构、集团、商户和门店
  status?: EReportStatus // 报表状态
  // TODO: 创建时间和更新时间
}

// 报表下载查询参数
export interface IReportReleaseParams extends IBiz {
  size: number
  page: number
  code?: string // 报表代码
  name?: string // 报表名称
  type?: EReportType // 报表类型
  status?: EReportStatus // 报表状态
  // TODO: 生成时间
}

/** 报表下载请求体 */
export interface IReportReleaseDownload {
  key: string
}

export interface IReportReleaseDownloadPagination {
  url: string
}

@Injectable()
export abstract class ReportService {
  // 获取报表设定信息列表
  abstract getSettingList(params: IReportSettingParams): Observable<IReportSettingPagination>

  // // 获取报表配置信息列表
  abstract getConfigList(params: IReportConfigParams): Observable<IReportConfigPagination>

  // 获取已生成的报表记录列表
  abstract getReleaseList(params: IReportReleaseParams, str?: string): Observable<IReportReleaseRecordPagination>

  // 下载报表
  abstract downloadReport(key: string): Observable<IReportReleaseDownloadPagination>
}
